package com.example.photograph.utils;

import java.util.ArrayList;
import java.util.List;

/**
 * 功能描述：在指定范围内生成不会重复的数字,当重置后会生成之前已生成的数据
 *
 * @Author： phm
 * @Date： 2020-08-17 14:56
 */
public class Random {

    //生成范围如1000. 会生成1-1000的数据
    private int rang;
    //用于存储数据的盒子
    final List<Integer> numberBox ;
    //已使用的个数
    private int usedCount;
    //用于生成随机数
    private java.util.Random random = new java.util.Random();

    public Random(int rang) {
        //初始化随机数范围,及随机数盒子。
        this.rang = rang;
        //数据初始化
        usedCount =-1;
        numberBox = new ArrayList<Integer>(rang);
        for (int i = 1; i <=rang ; i++) {
            numberBox.add(i);
        }
    }
    /**
     * 功能描述：获取一个在指定范围内不会重复的数字
     * @Author： phm
     * @Date： 2020/8/18 11:13
     *  * @return : int
     */
    public int randomInt(){

        if(usedCount==-1 || usedCount==rang){
            throw new RuntimeException("RandomNum无法再生产,请重置");
        }
        //获取一个随机数,在rang -count范围内
        int index = random.nextInt(rang - usedCount);
        //获取在数据盒子中指定位置的数据
        Integer result = numberBox.get(index);
        //将已被获取的数据 放置到末尾。
        swap(index,rang - usedCount-1);
        //已使用个数+1
        usedCount++;
        return result;
    }
    /**
     * 功能描述：交换数据盒子中两个数据的位置
     * @Author： phm
     * @Date： 2020/8/18 11:13
     * @param start :
     * @param end :
     *  * @return : void
     */
    public void swap(int start,int end){
        if(numberBox != null){
            Integer temp = numberBox.get(start);
            numberBox.set(start,numberBox.get(end));
            numberBox.set(end,temp);
        }
    }
    /**
     * 功能描述：重置数据盒子,来保证可以继续生产
     * @Author： phm
     * @Date： 2020/8/18 11:14
     *  * @return : void
     */

    public void reset(){
        this.usedCount=0;
    }

    /**
     * 功能描述：判读是否需要重置
     * @Author： phm
     * @Date： 2020/8/18 11:15
     *  * @return : boolean
     */
    public boolean isNeedReset(){
        return usedCount==this.rang||usedCount==-1;
    }

}
